package com.jichangxiu.common.annotation;

import com.jichangxiu.common.constant.LimitType;
import org.springframework.core.annotation.AliasFor;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import java.lang.annotation.*;

/**
 * Put:
 *
 * @author Jcx
 * @create 2023-04-03 21:49
 */
@Documented
@ResponseBody
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@RequestMapping(method = RequestMethod.PUT)
public @interface Put {

    @AliasFor(annotation = RequestMapping.class) String name() default "";

    @AliasFor(annotation = RequestMapping.class) String[] value() default {};

    @AliasFor(annotation = RequestMapping.class) String[] path() default {};

    @AliasFor(annotation = RequestMapping.class) String[] params() default {};

    @AliasFor(annotation = RequestMapping.class) String[] headers() default {};

    @AliasFor(annotation = RequestMapping.class) String[] consumes() default {};

    @AliasFor(annotation = RequestMapping.class) String[] produces() default {};

    /**
     * 是否统一返回值
     *
     * @return 默认是
     */
    boolean unifyResponseEnabled() default true;

    /**
     * 是否记录日志
     *
     * @return 默认是
     */
    boolean logEnabled() default true;

    /**
     * 是否给请求参数去空格
     *
     * @return 默认是
     */
    boolean parameterTrimEnabled() default true;

    /**
     * 是否给请求防重复提交
     *
     * @return 默认否
     */
    boolean parameterRepeatEnabled() default true;

    /**
     * 防止请求重复提交时长（秒）
     *
     * @return 默认 5 秒
     */
    int repeatTime() default 5;

    /**
     * 是否限流
     * <p>
     * 在 limitTime 时长内只能够接收 limitCount 个请求，超过则异常
     *
     * @return 默认否
     */
    boolean rateLimiterEnabled() default false;

    /**
     * 限流时长（秒）
     *
     * @return 默认 60 秒
     */
    int limitTime() default 60;

    /**
     * 限流请求次数
     *
     * @return 默认 100
     */
    int limitCount() default 100;

    /**
     * 限流策略
     *
     * @return 默认全局限流
     */
    LimitType limitType() default LimitType.DEFAULT;

}
